package org.com.liurz.iresources.activiti.listener;

import org.activiti.engine.RuntimeService;
import org.activiti.engine.delegate.DelegateTask;
import org.activiti.engine.delegate.TaskListener;
import org.activiti.engine.impl.el.FixedValue;
import org.com.liurz.iresources.activiti.entity.TaskNode;
import org.com.liurz.iresources.activiti.util.GsonUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import java.io.Serializable;
import java.util.Date;
import java.util.Set;

/**
 * @author liurz
 * @version V1.0
 * @Package org.com.liurz.iresources.activiti.listener
 * @date 2021/8/28 0:00
 * @Copyright © 2020-2028
 */

/**
 *  任务监听器，实现TaskListener接口
 *  配置时：配置为ALL,这样可以监听到创建新节点，删除当前节点等
 */

public abstract class BasicTaskListener implements Serializable,TaskListener {
    protected static Logger logger = LoggerFactory.getLogger(BasicTaskListener.class);

    // 节点处理人类型
    private FixedValue candidateType; // 同流程图中fieldName

    // 节点操作人处理情况：同意，拒绝等
    private FixedValue action;// 同流程图中fieldName

    // 节点中动态加入的流程参数值
    private FixedValue flowArg;

    // 节点加入的任务节点信息
    private FixedValue taskArg;

    @Autowired
    private RuntimeService runtimeService;

    @Override
    public void notify(DelegateTask delegateTask) {
        String eventName = delegateTask.getEventName();
        logger.info(eventName+":"+delegateTask+":"+delegateTask.getProcessInstanceId());
        // 可以通过create、delete两个事件，自定义一个待处理任务记录表
        switch (eventName) {
            case "create": // 创建节点：当前节点审批结束，创建下一个任务节点后触发（新建流程时创建第一个节点任务也会触发）
                createTaskNode(delegateTask);
                break;
            case "delete":  // 节点审批结束后会删除该任务节点：这个是删除节点前触发
                setSignerTaskNodeHandler(delegateTask);
                logger.info("删除任务"+delegateTask.getName()+"成功");
                break;
            default:
                break;
        }
    }

    // 节点删除时：会签节点处理人动态注入：在上个节点删除后会签节点创建前
    protected abstract void setSignerTaskNodeHandler(DelegateTask delegateTask);

    // 获取节点处理人
    protected abstract Set<String> getTaskCandidates(DelegateTask delegateTask);

    /**
     * 创建任务节点
     * @param delegateTask
     */
    private void createTaskNode(DelegateTask delegateTask) {
        TaskNode taskNode =new TaskNode();
        String taskName = delegateTask.getName();
        String proeccInstanceId = delegateTask.getProcessInstanceId(); // 流程id
        String taskId = delegateTask.getId();
        // 获取当前节点审批人
        Set<String> userIds = getTaskCandidates(delegateTask);
        String userIdStr ="";
        for(String userId : userIds){
            userIdStr=userIdStr+","+userId;
        }
        userIdStr=  userIdStr.substring(userIdStr.indexOf(",")+1,userIdStr.length());
        taskNode.setProcessId(proeccInstanceId);
        taskNode.setTaskId(taskId);
        taskNode.setTaskName(taskName);
        taskNode.setTaskCreateTime(new Date());
        taskNode.setTaskHandleUser(userIdStr);
        logger.info(GsonUtil.beanToJson(taskNode));

    }
}
